package main

// go语言中操作系统线程和goroutine的关系
// 一个操作系统线程对应用户态多个goroutine
// go程序可以同时使用多个操作系统线程
// goroutine和操作系统线程是多对多关系，即m:n
// goroutine调度模型  GMP   M:N 把m个goroutine分配给n个操作系统线程去执行  goroutine初始栈的大小是2kb
import (
	"fmt"
	"runtime"
	"sync"
)

var wg sync.WaitGroup

func a() {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		fmt.Printf("A:%d\n", i)
	}
}
func b() {
	defer wg.Done() //给wg等待组中的count数值减1，同wg.Add(-1)
	for i := 0; i < 10; i++ {
		fmt.Printf("B:%d\n", i)
	}
}

func main() {
	runtime.GOMAXPROCS(2) //默认cpu的逻辑核心数,默认跑满整个cpu
	fmt.Println(runtime.NumCPU())
	wg.Add(2) //设置等待组中要执行的子goroute的数量
	go a()
	go b()
	wg.Wait() //表示main 让主groutime进入等待，意味着阻塞
}
